'use strict'

const Koa = require('koa')
const app = new Koa()
const server = require('./src/graphql/index.js')


/**
 * 在 typeDefs 里定义 GraphQL Schema
 */
// const typeDefs = gql`
//   type Query {
//     book: Book
//     hello: String
//   }

//   enum BookStatus {
//     DELETED
//     NORMAL
//   }

//   type Book {
//     id: ID
//     name: String
//     price: Float
//     status: BookStatus
//   }
// `;

// const BookStatus = {
//   DELETED: 0,
//   NORMAL: 1
// }


/**
 * 在这里定义对应的解析器
 * 
 * 例如:
 *   针对查询 hello, 定义同名的解析器函数，返回字符串 "hello world!"
 *   针对查询 book，定义同名的解析器函数，返回预先定义好的对象（实际场景可能返回来自数据库或其他接口的数据）
 */
// const resolvers = {
// // Apollo Server 允许我们将实际的枚举映射挂载到 resolvers 中（这些映射关系通常维护在服务端的配置文件或数据库中）
//   // 任何对于此枚举的数据交换，都会自动将枚举值替换为枚举名，避免了枚举值泄露到客户端的问题
//   BookStatus,

//   Query: {
//     hello: () => 'hello world!',

//     book: (parent, args, context, info) => ({
//       id: '1',
//       name: '地球往事',
//       price: 66.3,
//       status: BookStatus.NORMAL
//     })
//   }
// };
// const isProd = process.env.NODE_ENV === 'production'

// // 创建Apollo Server实例
// const server = new ApolloServer({ typeDefs, resolvers,

//    introspection: !isProd,
//   playground: !isProd,
//   mocks: true,
//   formatError: error => {
//     // log detail of error here
//     return {
//       code: error.extensions.code,
//       message: error.message
//     }
//   }
//  })

// 异步启动函数
async function startServer() {
  try {
    // 1. 先启动Apollo Server
    await server.start()

    app.use(require('./src/middlewares/auth.js'))
    // 2. 再应用中间件到Koa
    server.applyMiddleware({ app })


    
    // 3. 启动Koa服务
    app.listen({ port: 4001 }, () =>
      console.log(`🚀 服务器已启动，访问 http://localhost:4001${server.graphqlPath} 查看GraphQL playground`)
    )
  } catch (err) {
    console.error('服务器启动失败:', err)
  }
}

// 调用启动函数
startServer()


